<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>javascript 阶段</title>
</head>

<body>
    <h3>arguments 对象</h3>
    <p>arguments 记录实参数据的一个对象,是一个伪数组!</p>

    <script>
        // 1.0 加法函数
        function add(x,y) {
            console.log(arguments);
            var total = x + y;
        }
        // 2.0 调用函数
        add(1111,99);

        // =========================================
        // 1.0 加法函数
        function add() {
            // console.log(arguments);
            var x = arguments[0];// 代表实参 2
            var y = arguments[1];// 代表实参 98
            var total = x + y;
            console.log(total);
        }
        // 2.0 调用函数
        // add(2, 98);
        // arguments 具有数组的特征和length属性,但是不能调用数组的API.
        // arguments 是个伪数组,可以通过索引值取值
        // arguments 仅仅可以在函数作用域中使用
        // console.log(arguments);// 报错

        // =========================================
        // 1.0 定义函数
        // function foo(){
        //     console.log("test");
        // }
        
        // 1.0 定义函数
        var foo = function() {
            console.log(arguments);
            // arguments.length 等于 0 ,说明没有实参
            // arguments.callee 代表函数本身
            console.log( foo === arguments.callee);// true 

            // 函数的自身调用(递归)
            // 如果是直接调用函数自身,那么就出现死循环
            // foo();
            // arguments.callee();
            console.log("test");
        }
        // 2.0 调用函数
        // foo("red");
        // console.log( foo );

        // =========================================
        // 报错: Maximum call stack size exceeded 
        // 叫做栈溢出( 因为死循环, 导致内存不足而报错)
        // var index = 5;
        // function example() {
        //     index --;
        //     if(index < 0){
        //         return ;
        //     }
        //     // example();
        //     // arguments.callee();
        //     console.log("index:",index);
        // }
        // example();
        


        // 总结:
            // 1. arguments 对象 记录函数实参数据,取实参数据,需要有序0,1,2,3...
            // 2. 函数仅仅传递了实参,在没有形参的情况下,可以使用实参数据? 可以 
            // 3. 函数本身 arguments.callee ,在函数作用域中, 不能直接调用,否则报错
            // 4. arguments 仅仅在函数作用域中使用
    </script>
</body>

</html>